package com.eastedu.report.common.util;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.eastedu.report.common.model.parameter.ReportGenerateParameter;
import com.eastedu.report.common.model.po.CommonDimensionEntity;
import com.eastedu.report.common.model.po.CommonRankEntity;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * The interface Sql util.
 *
 * @author superman
 */
public interface SqlUtil {

    /**
     * 查询条件构造(默认直接查询指定时间)
     *
     * @param <T>       数据类型
     * @param parameter 公共查询参数
     * @param clazz     查询的数据类型
     * @return the lambda query wrapper
     */
    static <T extends CommonDimensionEntity> LambdaQueryWrapper<T> queryWrapper(ReportGenerateParameter parameter, Class<T> clazz) {
        return SqlUtil.queryWrapper(parameter,
                                    wrapper -> {
                                        wrapper.eq(CommonDimensionEntity::getCodeType, parameter.getCodeType());
                                        wrapper.eq(CommonDimensionEntity::getDateCode, parameter.getDateCode());
                                    },
                                    clazz);
    }

    /**
     * 自定义查询条件（除了公共参数）
     *
     * @param <T>       数据类型
     * @param parameter 公共查询参数
     * @param consumer  自定义查询
     * @param clazz     查询的数据类型
     * @return the lambda query wrapper
     */
    static <T extends CommonDimensionEntity> LambdaQueryWrapper<T> queryWrapper(ReportGenerateParameter parameter,
                                                                                Consumer<LambdaQueryWrapper<T>> consumer,
                                                                                Class<T> clazz) {
        LambdaQueryWrapper<T> wrapper = Wrappers.lambdaQuery(clazz)
                .eq(CommonDimensionEntity::getSchoolGroupId, parameter.getSchoolGroupId())
                .eq(CommonDimensionEntity::getSchoolGuid, parameter.getSchoolGuid())
                .eq(CommonDimensionEntity::getSectionCode, parameter.getSection());
        consumer.accept(wrapper);
        return wrapper;
    }


    /**
     * 查询列表数据并转换
     *
     * @param <T>       the type parameter
     * @param <R>       the type parameter
     * @param parameter the parameter
     * @param mapper    the mapper
     * @param clazz     the clazz
     * @param function  the function
     * @return the list
     */
    static <T extends CommonRankEntity, R> List<R> query(ReportGenerateParameter parameter,
                                                         BaseMapper<T> mapper,
                                                         Class<T> clazz,
                                                         Function<List<T>, List<R>> function) {
        // 查询资源接收应用明细数据
        LambdaQueryWrapper<T> wrapper = queryWrapper(parameter,
                                                     clazz);
        List<T> pos = mapper.selectList(wrapper);
        return function.apply(pos);
    }
}
